//
//  ZLShipVCManger.h
//  zhilian
//
//  Created by 张奇 on 2021/3/12.
//  Copyright © 2021 LZT. All rights reserved.
//

#import <Foundation/Foundation.h>
//#import "ZGNewHomeIconModel.h"


#define RoutingPrefix @"tg://"

NS_ASSUME_NONNULL_BEGIN
typedef void(^ShipeFinishCallback)(id _Nullable data);

@interface ZLShipVCManger : NSObject
/*
 作用：1.将后台返回的url自动匹配到对应的控制器,解析参数并跳转；2.上线后如果想要临时更改跳转页面及参数，只需修改返回的url；3.解耦
 使用：1.在shipConfig.plist文件里配置路由；2.调用pushNavtive跳转
 eg.新增一个路由跳转时，例如线下店抢购路由，需要在plist文件里添加：
 1.路由名称(必填): 例如vouchersBuy，选择NSDictionary类型
 2.添加控制器名称(必填): controller(固定): O2OVouchersBuyController, String类型
 3.添加路由注释(必填): desc(固定): 线下店抢购, String类型
 4.路由参数(可选): 如果控制器中接收参数与url参数名相同则不用配置；
           如果不同，则需要在convertKeys里配置 convertKeys(固定), 选择NSDictionary类型, 具体参数例如'_id': 'orderId'
 5.配置额外的参数(可选)，举例如下：

 @"zl://": {
    @"vouchersBuy": @{
       //一.必须配置
       @"controller": @"O2OVouchersBuyController", //1.跳转至控制器的名称
       @"desc": @"线下店抢购", //2.路由注释
 
       //二.可选配置
       //2.1 如果后台给的参数名和控制器使用的参数名不一致，可以在这里转换
       @"convertKeys": @{
          @"_id": @"orderId", //例如将_id转换为orderId
          @"callBack": @"myCallBack", //1.需要回调的block名, 默认callBack，不需要额外配置可直接使用，如果需要改名(例如改为myCallBack)，则需要配置为@"callBack": @"myCallBack"

        }
 
       //2.2 额外的参数，主要是用来给配置模型对象参数,静态参数,判断参数逻辑和页面状态，例如导航控制器状态，弹出样式，是否需要判断登录等
       @"extras": @{
          @"testOrderApplySalesModel": [[ZLOrderApplySalesSelectController alloc] init] //
          @"testSource": @"京东",
          @"hideNavBar": @"1", //1.隐藏导航栏
          @"isNeedLogin": @"1", //2.是否需要登陆后才能跳转, 默认不需要
          @"isPresent": @"0",  //3.是否是present, 默认push
       }
       
     }
   
 }
 
 使用eg:
 1.跳转无参数
 [ZLShipVCManger pushNavtive:@"zl://shop/cart"];
 
 2.跳转参数放在url中
 [ZLShipVCManger pushNavtive:[NSString stringWithFormat:@"zl://o2o/vouchersBuy?storeId=%@&selectId=%@", model.packageStoreId, model._id]];
 
 3.跳转后接收回调
 [ZLShipVCManger pushNavtive:@"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1" rootViewController:rootVC finishCallBack:^(id  _Nullable data) {
       NSLog(@"回调了 %@", data);
 }];
 
 4.跳转传递自定义对象参数
 ZLOrderApplySalesModel *model = [ZLOrderApplySalesModel modelWithOrderId:@"1" goodsId:@"2" goodsType:@"3" goodsNum:@"4"];
 [ZLShipVCManger pushNavtive:navtive rootViewController:rootVC extrasParams:@{@"orderApplySalesModel": model} finishCallBack:^(id  _Nullable data) {
     NSLog(@"回调了 %@", data);
 }];

 */

+ (ZLShipVCManger *)shareInstance;

/*
 @param shipUrl 跳转的路由地址
 返回值 是否配置过该路由：YES,可直接使用新的路由跳转; NO，表示未配置或需要使用旧的路由跳转
 */
+ (BOOL)isHavingConfigShipUrl:(NSString *)shipUrl;

/*
 @param navtive 跳转的url：@"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1";
 */
+ (void)pushNavtive:(NSString *)navtive;

/*
 @param navtive 跳转的url：@"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1";
 @param rootVC  默认nil.
 */
+ (void)pushNavtive:(NSString *)navtive
 rootViewController:(UINavigationController* _Nullable)rootVC;

/*
 @param navtive 跳转的url：@"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1";
 @param callBack 被弹出控制器需要回调的block
 */
+ (void)pushNavtive:(NSString *)navtive
       extrasParams:(NSDictionary * _Nullable)extrasParams;

/*
 @param navtive 跳转的url：@"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1";
 @param extrasParams    额外参数，一般用来传递对象，导航栏状态，页面状态等，默认nil.
 @param rootVC  默认nil.
 */
+ (void)pushNavtive:(NSString *)navtive
       extrasParams:(NSDictionary * _Nullable)extrasParams
 rootViewController:(UINavigationController* _Nullable)rootVC;

/*
 @param navtive   跳转的url：eg. @"zl://shop/goods?_id=5fe97ec9d1b2b7465187f260&uid=1";
 @param rootVC    默认nil.
 @param extrasParams    额外参数，一般用来传递对象，导航栏状态，页面状态等，默认nil.
 @param callBack  被弹出控制器需要回调的block, 默认nil. 使用回调block时，runtime给被弹出控制器赋值的默认block名称为callBack
                  如果回调的名字为myCallBack,则需要在plist中该路径对应的convertKeys中配置"callBack": "myCallBack"
 */
+ (void)pushNavtive:(NSString *)navtive
 rootViewController:(UINavigationController* _Nullable)rootVC
             extrasParams:(NSDictionary * _Nullable)extrasParams
     finishCallBack:(ShipeFinishCallback _Nullable)callBack;


/*
 跳转到 今日头条 免费小说里面
 */
//+ (void)zlPushNovel;
///*
// /// 获取当天阅读时长，单位秒
// */
//+ (NSUInteger)getReadDuration;
//
//
//
///// 根据后台跳转配置跳转至相关页面
///// @param iconId 图标id
///// @param jumpConfig 模型 根据内部actionType 跳转优先级 0:原生地址 1:小程序地址 2:H5地址
///// @param showHUDInView 加载图
//+ (void)pushActionWithIconId:(NSString *)iconId
//                  jumpConfig:(ZGHomeIconJumpConfigModel *)jumpConfig
//               showHUDInView:(UIView *)showHUDInView;

@end

NS_ASSUME_NONNULL_END
